package process

import (
	"chatroom/client/utils"
	"chatroom/common/message"
	"encoding/json"
	"fmt"
	"net"
	"os"
)

//显示登录成功后的界面
func ShowMenu(userId int) {
	fmt.Printf("-------欢迎用户 %d 登录系统------\n", userId)
	fmt.Println("-------1.显示在线用户列表------")
	fmt.Println("-------2.发送消息------")
	fmt.Println("-------3.信息列表------")
	fmt.Println("-------4.退出系统------")
	fmt.Println("请选择（1-4）：")
	var key int
	//var content string

	//因为总会使用到smsprocess 实例，因此将其定义在 swtich 外部，防止反复调用
	smsProcess := &SmsProcess{}
	fmt.Scanf("%d\n", &key)
	switch key {
	case 1:
		//fmt.Println("显示在线用户列表")
		outputOnlineUser()
	case 2:
		//fmt.Println("发送消息")
		smsProcess.Choicechat() //选择群聊或私聊
	case 3:
		fmt.Println("查看信息列表")
	case 4:
		fmt.Println("你选择提出了系统")
		os.Exit(0)
	default:
		fmt.Println("你输入的选项不正确...")
	}

}

//和服务器端保持通讯
func serverProcessMes(conn net.Conn) {
	//创建一个transfer 实例，不停的读取服务器发送的消息
	tf := &utils.TransFer{
		Conn: conn,
	}
	for {
		fmt.Println("客户端正在等待读取服务器发送的消息")
		mes, err := tf.ReadPkg()
		if err != nil {
			fmt.Println("tf.ReadPkg err=", err)
			return
		}
		//如果读取到消息，又是下一步处理逻辑
		switch mes.Type {
		case message.NotifyUserStatusMesType: //通知有人上线下线
			//处理
			//1.取出 NotifyUserStatusMes
			var notifyUserStatusMes message.NotifyUserStatusMes
			json.Unmarshal([]byte(mes.Data), &notifyUserStatusMes)
			//2.把 NotifyUserStatusMes 的信息状态，保存在客户 map[int]User 中
			updateUserStatus(&notifyUserStatusMes)
		case message.SmsResMesType: //有人群发消息了
			//接收群发消息
			outputGroupResMes(&mes)
		case message.PrivateResMesType:
			//接收私发消息
			outputPrivateResMes(&mes)
		default:
			fmt.Println("服务端返回了一个未知的消息类型")
		}
		//fmt.Print("mes=%v\n",mes)

	}
}
